from rest_framework import serializers
from apps.databasetest.models import DatabaseConfig


class DatabaseConfigEditSerializer(serializers.ModelSerializer):
    # 针对嵌套对象字段（如options），使用JSONField接收
    options = serializers.JSONField(required=False, allow_null=True)
    # 时间 zone 允许为null
    time_zone = serializers.CharField(required=False, allow_null=True, allow_blank=True)
    # 数字类型字段显式定义（避免类型转换问题）
    conn_max_age = serializers.IntegerField(required=False, min_value=0)
    port = serializers.IntegerField(required=False, min_value=1, max_value=65535)

    class Meta:
        model = DatabaseConfig
        # 包含所有需要编辑的字段（与接口数据对应）
        fields = [
            'id',  # 用于标识要编辑的配置
            'description', 'db_alias', 'db_name', 'engine', 'db_type',
            'host', 'port', 'user', 'password', 'options', 'time_zone',
            'autocommit', 'atomic_requests', 'conn_health_checks', 'conn_max_age',
            'is_active', 'remark', 'organ_id', 'organ_name'  # organ_id用于权限校验
        ]
        extra_kwargs = {
            # 必传字段校验（根据业务需求调整）
            'db_alias': {'required': True, 'error_messages': {'required': '数据库别名不能为空'}},
            'db_name': {'required': True, 'error_messages': {'required': '数据库名称不能为空'}},
            'host': {'required': True, 'error_messages': {'required': '主机地址不能为空'}},
            'db_type': {'required': True, 'error_messages': {'required': '数据库类型不能为空'}},
            # 可选字段允许为空
            'password': {'required': False, 'allow_blank': True, 'allow_null': True},  # 空密码不更新
            'engine': {'required': False},
            'organ_id': {'required': False}  # 非必传，由后端根据用户自动填充
        }

    # 自定义验证：端口范围（覆盖原方法，使用IntegerField自带校验后可简化）
    def validate_port(self, value):
        # 若传值则校验，否则不校验（允许为空）
        if value is not None and (value < 1 or value > 65535):
            raise serializers.ValidationError("端口必须在1-65535之间")
        return value

    # 自定义验证：autocommit等布尔值字段（确保传入1/0或True/False时正确转换）
    def validate_autocommit(self, value):
        if isinstance(value, bool):
            return 1 if value else 0  # 转换为1/0存储
        if value in (0, 1):
            return value
        raise serializers.ValidationError("autocommit必须为布尔值或1/0")

    # 同理处理其他布尔相关字段
    def validate_atomic_requests(self, value):
        if isinstance(value, bool):
            return 1 if value else 0
        if value in (0, 1):
            return value
        raise serializers.ValidationError("atomic_requests必须为布尔值或1/0")

    def validate_conn_health_checks(self, value):
        if isinstance(value, bool):
            return 1 if value else 0
        if value in (0, 1):
            return value
        raise serializers.ValidationError("conn_health_checks必须为布尔值或1/0")
